package function

import (
	"fmt"
	"time"

	"gitee.com/knowgo/ego/core/types"
	"gitee.com/knowgo/ego/core/validator"
)

type GroupInfo struct {
	Name        string `json:"name"`
	Description string `json:"description"`
	Deprecated  bool
	Services    []*Service `json:"services"`
}

func (g *GroupInfo) CheckServiceName(funcName string) (string, error) {
	svcName := fmt.Sprintf("%s.%s", g.Name, funcName)
	for _, s := range g.Services {
		if s.Name == svcName {
			return "", fmt.Errorf("service [%s] is exists", svcName)
		}
	}
	return svcName, nil
}

// ServiceInfo 服务功能定义，给前端的接口
type ServiceInfo struct {
	Name          string            `json:"name"`
	Description   string            `json:"description,omitempty"`
	Deprecated    bool              `json:"deprecated"`
	ArgObjectID   string            `json:"argObjectId,omitempty"`
	ArgIsRequired bool              `json:"argIsRequired"`
	Response      *ResponseTypeInfo `json:"response"`
	// OutputObjectID string              `json:"outputObjectId,omitempty"`
	// OutputIsArray  bool                `json:"outputIsArray"`
	// History        []*CR  `json:"history,omitempty"`
	// ErrorMessage   string `json:"errorMessage,omitempty"`
}

type ResponseTypeInfo struct {
	ID          string              `json:"-"`
	Name        string              `json:"name"`
	Description string              `json:"description,omitempty"`
	Type        string              `json:"type"`
	Time        bool                `json:"time"`              // 是否时间类型
	Array       bool                `json:"array,omitempty"`   // 是否是数组
	KeyType     string              `json:"keyType,omitempty"` // 如果不是空字符串，则说明是 map 类型
	TypeId      string              `json:"typeId,omitempty"`  // 如果不是空，则该类型是自定义 struct，且该值为 struct 类型的 id
	Fields      []*ResponseTypeInfo `json:"fields,omitempty"`
}

type ArgumentTypeInfo struct {
	ID                string                `json:"-"`
	Name              string                `json:"name"`
	FieldName         string                `json:"-"` // 变量名称
	Description       string                `json:"description,omitempty"`
	Type              string                `json:"type"`
	Required          bool                  `json:"required"` // 是否必须提交的数据
	Range             string                `json:"range"`    // 取值范围说明
	Validators        []validator.Validator `json:"-"`
	Ptr               bool                  `json:"-"`                 // 是否指针
	Time              bool                  `json:"time"`              // 是否时间类型
	TimeFormat        string                `json:"timeFormat"`        // 时间格式，空字符串表示为毫秒
	TimeLocation      *time.Location        `json:"-"`                 // 时间格式
	Array             bool                  `json:"array,omitempty"`   // 是否是数组
	KeyType           string                `json:"keyType,omitempty"` // 如果不是空字符串，则说明是 map 类型
	ItemType          *ArgumentTypeInfo     `json:"-"`                 // 数组和 map 存储项的类型
	TypeId            string                `json:"typeId,omitempty"`  // 如果不是空，则该类型是自定义 struct，且该值为 struct 类型的 id
	Fields            []*ArgumentTypeInfo   `json:"children,omitempty"`
	JsonValueIsString bool                  `json:"-"`          // JsonValueIsString json tag 中有 string 标记
	Deprecated        bool                  `json:"deprecated"` // 是否弃用该参数
	TypeInfo          *types.TypeInfo       `json:"-"`
}

// type ObjectInfo struct {
// 	ID          string        `json:"id,omitempty"`
// 	ReferenceID string        `json:"reference,omitempty"` // 指向其它 ObjectInfo.ID，原生数据类型为空
// 	Name        string        `json:"name"`
// 	Type        string        `json:"type"`
// 	Require     bool          `json:"require,omitempty"` // TODO 递归引用时，需要处理截断 Require 链
// 	Range       string        `json:"range,omitempty"`   // 取值范围
// 	Pattern     string        `json:"pattern,omitempty"` // 字符串参数的正则表达式验证
// 	Array       bool          `json:"array,omitempty"`   // 是否是数组
// 	Description string        `json:"description,omitempty"`
// 	Children    []*ObjectInfo `json:"children,omitempty"`
// 	// Deprecated  bool          `json:"deprecated"` // 是否不建议使用

// 	ReferenceCount int `json:"-"` // 引用次数
// }
